/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modelos;

import conexion.CRUD;
import conexion.Conexion;
import global.DatosGlobales;
import interfaces.modelo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Luis
 */
public class Materia implements modelo{
    
    public static String TABLA = "materias";
    public static String SP = "SP_materias";
    
    private Integer idMateria;
    public static final String PROP_IDMATERIA = "idMateria";
    
    private String nombre;
    public static final String PROP_NOMBRE = "nombre";
    
    private String descripcion;
    public static final String PROP_DESCRIPCION = "descripcion";
    
    private Integer creditos;
    public static final String PROP_CREDITOS = "creditos";
    
    private Integer horas;
    public static final String PROP_HORAS = "horas";
    
    private Profesor titular;
    public static final String PROP_TITULAR = "titular";
    
    private Boolean nuevo= Boolean.TRUE;

    public Materia(Integer idMateria, String nombre, String descripcion, Integer creditos, Integer horas, Profesor titular) {
        this.idMateria = idMateria;
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.creditos = creditos;
        this.horas = horas;
        this.titular = titular;
    }

    public Materia() {
        this.idMateria = 0;
        this.creditos = 0;
        this.horas = 0;
    }

   
    
    
    public Profesor getTitular() {
        return titular;
    }


    public void setTitular(Profesor titular) {
        Profesor oldTitular = this.titular;
        this.titular = titular;
        propertyChangeSupport.firePropertyChange(PROP_TITULAR, oldTitular, titular);
    }


    /**
     * Get the value of horas
     *
     * @return the value of horas
     */
    public Integer getHoras() {
        return horas;
    }

 
    public void setHoras(Integer horas) {
        Integer oldHoras = this.horas;
        this.horas = horas;
        propertyChangeSupport.firePropertyChange(PROP_HORAS, oldHoras, horas);
    }


  
    public Integer getCreditos() {
        return creditos;
    }


    public void setCreditos(Integer creditos) {
        Integer oldCreditos = this.creditos;
        this.creditos = creditos;
        propertyChangeSupport.firePropertyChange(PROP_CREDITOS, oldCreditos, creditos);
    }



    public String getDescripcion() {
        return descripcion;
    }

 
    public void setDescripcion(String descripcion) {
        String oldDescripcion = this.descripcion;
        this.descripcion = descripcion;
        propertyChangeSupport.firePropertyChange(PROP_DESCRIPCION, oldDescripcion, descripcion);
    }



    public String getNombre() {
        return nombre;
    }


    public void setNombre(String nombre) {
        String oldNombre = this.nombre;
        this.nombre = nombre;
        propertyChangeSupport.firePropertyChange(PROP_NOMBRE, oldNombre, nombre);
    }

    

 
    public Integer getIdMateria() {
        return idMateria;
    }

   
    public void setIdMateria(Integer idMateria) {
        Integer oldIdMateria = this.idMateria;
        this.idMateria = idMateria;
        propertyChangeSupport.firePropertyChange(PROP_IDMATERIA, oldIdMateria, idMateria);
    }
    private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

 
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }


    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    @Override
    public void guardar() {
          try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Materia.SP+"(?,?,?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        if(getNuevo()){
            prepareCall.setInt(i++, CRUD.Insert.getOpcion());
        }else{
            prepareCall.setInt(i++, CRUD.Update.getOpcion());
        }
        prepareCall.setInt(i++, this.getIdMateria());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.getDescripcion());
        prepareCall.setInt(i++, this.getCreditos());
        prepareCall.setInt(i++, this.getHoras());
        prepareCall.setInt(i++, this.getTitular().getIdProfesor());
        prepareCall.setInt(i++, DatosGlobales.getInstance().getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }

    @Override
    public void eliminar() {
         try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Materia.SP+"(?,?,?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        prepareCall.setInt(i++, CRUD.Delete.getOpcion());
        prepareCall.setInt(i++, this.getIdMateria());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.getDescripcion());
        prepareCall.setInt(i++, this.getCreditos());
        prepareCall.setInt(i++, this.getHoras());
        prepareCall.setInt(i++, this.getTitular().getIdProfesor());
        prepareCall.setInt(i++, DatosGlobales.getInstance().getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }
    
    public static List<Materia> getMaterias(String where){
        List<Materia> result = new ArrayList<Materia>();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Materia.TABLA);
            while (rs.next()) {
                result.add(Materia.makeMateria(rs));
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    public static List<Materia> getMateriasByAlumno(Integer matricula){
        List<Materia> result = new ArrayList<Materia>();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("SELECT b1.* FROM alumnos_materias a1 INNER JOIN"
                    + " materias b1 ON a1.idmateria = b1.idmateria WHERE a1.matricula = "+matricula);
            while (rs.next()) {
                result.add(Materia.makeMateria(rs));
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    public static Materia getMateriaById(Integer id){
        Materia result = new Materia();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Materia.TABLA + " where idMateria ="+id);
            while (rs.next()) { 
                result = Materia.makeMateria(rs);
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
  
    private static Materia makeMateria(ResultSet rs) throws SQLException{
        Materia result = null;
                int i =1;
                Integer idMateria = rs.getInt(i++);
                String nombre = rs.getString(i++);
                String descripcion = rs.getString(i++);
                Integer creditos = rs.getInt(i++);
                Integer horas = rs.getInt(i++);
                Profesor titular = Profesor.getProfesorById(rs.getInt(i++));
                
                result = new Materia(idMateria, nombre, descripcion, creditos, horas, titular);
                result.setNuevo(Boolean.FALSE);
        return result;
    }
    
    public String toString(){
        return ""+getNombre();
    }

    /**
     * @return the nuevo
     */
    public Boolean getNuevo() {
        return nuevo;
    }

    /**
     * @param nuevo the nuevo to set
     */
    public void setNuevo(Boolean nuevo) {
        this.nuevo = nuevo;
    }
}
